#include <xitemcall.h>
#include <call/xitemcallprint.h>
#include <call/xitemcalllet.h>
#include <call/xitemcallset.h>
#include <call/xitemcallarithmetic.h>
#include <call/xitemcalllogic.h>
#include <call/xcallbreak.h>

std::shared_ptr<XItemCall> XItemCall::makeItemCall(const std::wstring& name) {
    if (name == L"print")
        return std::make_shared<XItemCallPrint>();
    if (name == L"let")
        return std::make_shared<XItemCallLet>();
    if (name == L"and")
        return std::make_shared<XItemCallAnd>();
    if (name == L"or")
        return std::make_shared<XItemCallOr>();
    if (name == L"not")
        return std::make_shared<XItemCallNot>();
    if (name == L"boolean")
        return std::make_shared<XItemCallBoolean>();
    if (name == L">")
        return std::make_shared<XItemCallGreate>();
    if (name == L">=")
        return std::make_shared<XItemCallGreateEqual>();
    if (name == L"<")
        return std::make_shared<XItemCallLess>();
    if (name == L"<=")
        return std::make_shared<XItemCallLessEqual>();
    if (name == L"equal")
        return std::make_shared<XItemCallEqual>();
    if (name == L"+")
        return std::make_shared<XItemCallPlus>();
    if (name == L"-")
        return std::make_shared<XItemCallMinus>();
    if (name == L"*")
        return std::make_shared<XItemCallMulti>();
    if (name == L"/")
        return std::make_shared<XItemCallDiv>();
    if (name == L"break")
        return std::make_shared<XCallBreak>();
    return nullptr;
}

std::shared_ptr<XItemCall> XItemCall::makeSet(std::shared_ptr<XItem>& input) {
    return std::make_shared<XItemCallSet>(input);
}
